#ifndef DEFINES_H_GGJ
#define DEFINES_H_GGJ

#define FRAME_RATE		1/60.f
#define SC_WIDTH		1024
#define SC_HEIGHT		768

#define MOVEMENT_PADDING 10.f

#include "Utils\DataUtils.h"

enum EGameState
{
	EGameState_None,
	EGameState_Splash,
	EGameState_MainMenu,
	EGameState_InGame,

	EGameState_Count
};

enum EFadeState
{
	EFadeState_None,
	EFadeState_In,
	EFadeState_Out
};

enum EActiveChar
{
	EActiveChar_Dog,
	EActiveChar_Ox,
	EActiveChar_Rat,
	EActiveChar_Rooster
};

namespace ObjectLayer
{
	enum Enum
	{
		Background, // probably nothing goes here
		Ground,		// things characters walk over
		Characters, // characters layer
		Roof,		// things characters walk under (unless the active character is the rat and higher up)

		Count
	};

	// keep in sync with Enum above, excluding "Count" value
	static std::string StringForEnum[ObjectLayer::Count] =
	{
		"background",
		"ground",
		"characters",
		"roof"
	};

	static std::map<std::string, ObjectLayer::Enum> EnumForString = DataUtils::GetInvertedIndex<ObjectLayer::Enum>(ObjectLayer::StringForEnum, ObjectLayer::Count);
}

namespace ObjectType
{
	enum Enum
	{
		None,

		Character,
		HayStack,
		Wall,
		Fence,
		Rope,

		Count,
	};

	// keep in sync with Enum above, excluding "Count" value
	static std::string StringForEnum[ObjectType::Count] =
	{
		"none",
		"character",
		"haystack",
		"wall",
		"fence",
		"rope",
	};

	static std::map<std::string, ObjectType::Enum> EnumForString = DataUtils::GetInvertedIndex<ObjectType::Enum>(ObjectType::StringForEnum, ObjectType::Count);
}

namespace CharacterType
{
	enum Enum
	{
		None,

		Ox,
		Rat,
		Dog,
		Rooster,
		Farmer,

		Count
	};

	// keep in sync with Enum above, excluding "Count" value
	static std::string StringForEnum[CharacterType::Count] =
	{
		"none",
		"ox",
		"rat",
		"dog",
		"rooster",
		"farmer"
	};

	static std::map<std::string, CharacterType::Enum> EnumForString = DataUtils::GetInvertedIndex<CharacterType::Enum>(CharacterType::StringForEnum, CharacterType::Count);
}

#endif // DEFINES_H_GGJ